package cn.itcast.zt.java8.model.single;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;

/**
 * Spring中实例化对象bean 单例注入多例默认是单例，如果想多例这样搞
 * create by zhangtian105 on 2021/8/3
 * 在单例A中有一个B类成员变量，
 * B类通过@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
 * 注解标注这个类在A中是一个多例实现。这时候即使A是一个单例，B也会是一个多例
 *
 * 不加proxyMode = ScopedProxyMode.TARGET_CLASS注解，单单使用@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)导致在单例A中B也一直是单例，
 * 因为A只初始化一次。
 * 加入proxyMode = ScopedProxyMode.TARGET_CLASS本质上加入了AOP机制，对B类的方法调用前，都会创建新的对象，这就导致了无法使用同一个对象连续两次调用B类方法
 *
 * 或者如果就是B类仅仅使用@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)注解标注，那怎么解决B一直是个单例的问题呢？
 * 在A类中不使用@Autowire自动注入的方式，而是使用ApplicationContext.getBean()的方式，这样每次getBean都得到一个新的对象b
 */
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE,proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SpringSingle {
    // 以下链接也是解决之道，多例可以提高并发能力，单例模式中两个方法不能同时操作修改同一个成员变量 会有并发问题
    // https://cloud.tencent.com/developer/article/1671333?share_token=8446962d-456b-40ba-90a6-a09aa3eba8eb
}
